<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title></title>
</head>

<body>
  <script>
    /**
     1. this 的绑定不同
     1.1 普通函数：有自己的 this 上下文，由调用方式决定
      - 作为方法调用时，this 指向调用对象
      - 作为函数调用时，this 在严格模式下是 undefined，非严格模式下是全局对象(window)
      - 可以使用 call(), apply(), bind() 改变 this 指向

     1.2 箭头函数：没有自己的 this，继承自外层作用域的 this 值
      - this 在定义时确定，不会改变
      - 不能使用 call(), apply(), bind() 改变 this

     2. arguments 对象
     2.1 普通函数：有 arguments 对象，包含所有传入参数
     2.2 箭头函数：没有 arguments 对象，但可以使用剩余参数 ...args 获取

     3. 构造函数
     3.1 普通函数：可以用作构造函数，使用 new 关键字
     3.2 箭头函数：不能用作构造函数，使用 new 会抛出错误
     */
    // function fn1() {
    //   console.log(this);
    // }
    // fn1(); // window

    // const obj = {
    //   name: 'why',
    //   eating: function () {
    //     console.log(this);
    //   }
    // }
    // obj.eating(); // obj

    // const obj = {
    //   name: 'why',
    //   eating: () => {
    //     console.log(this);
    //   }
    // }
    // obj.eating();

    // --------JS中面向对象是通过构造函数去产生对象, 类(class)只是ES6中推出的语法糖 ------
    // 注意: 只有new 函数() ---> 这个函数才被称为构造函数
    // function Person() { }
    // const p1 = new Person();
    // console.log(p1);
    // const p2 = new Person();
    // console.log(p2);
    // console.log(p1 === p2)

    // const Person = () => { }
    // const p1 = new Person();
    // console.log(p1)
  </script>
</body>

</html>